package com.itheima.sh.b_jdbc_test02;

import com.itheima.sh.util.JDBCUtils01;
import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTest01 {
    /*
        模拟登陆
     */
    @Test
    public void login() throws Exception {
        //定义变量保存用户名和密码
        String user_name = "zhangsan";
        String pwd = "123";
        //1.获取连接
        Connection conn = JDBCUtils01.getConnection();
        //2.使用连接对象调用方法获取发送sql语句的对象
        Statement st = conn.createStatement();
        //3.发送sql语句
//        ResultSet rs = st.executeQuery("SELECT * FROM user WHERE username='zhangsan' AND password='123'");
        /*
            注意啦：在实际使用中，双引号中书写单引号，单引号中书写双引号
            1."SELECT * FROM user WHERE username='"
            2."zhangsan"
            3."' AND password='"
            4."123"
            5."'"

            组合上述内容：
            SELECT * FROM user WHERE username='zhangsan' AND password='123'
         */
        ResultSet rs = st.executeQuery("SELECT * FROM user WHERE username='"+user_name+"' AND password='"+pwd+"'");
        //4.使用if处理结果集
        if(rs.next()){
            //说明查询到了数据
            //获取用户名
            String username = rs.getString("username");
            System.out.println("恭喜您，"+username+"登陆成功");
        }else{
            System.out.println("用户名或者密码错误");
        }

        //5.释放资源
        JDBCUtils01.release(conn,st,rs);
    }

    /*
        模拟登陆
        sql注入问题：就是在不知道用户名密码的情况下，输入一些特殊的符号可以查询的正确的数据
     */
    @Test
    public void login2() throws Exception {
        //定义变量保存用户名和密码
        String user_name = "zhangsan' -- ";
        String pwd = "oaiauq81811";
        //1.获取连接
        Connection conn = JDBCUtils01.getConnection();
        //2.使用连接对象调用方法获取发送sql语句的对象
        Statement st = conn.createStatement();
        //3.发送sql语句
//        ResultSet rs = st.executeQuery("SELECT * FROM user WHERE username='zhangsan' AND password='123'");
        /*
            注意啦：在实际使用中，双引号中书写单引号，单引号中书写双引号
            1."SELECT * FROM user WHERE username='"
            2."zhangsan"
            3."' AND password='"
            4."123"
            5."'"

            组合上述内容：
            SELECT * FROM user WHERE username='zhangsan' AND password='123'

            SELECT * FROM user WHERE username='zhangsan' -- ' AND password='oaiauq81811'

         */
        ResultSet rs = st.executeQuery("SELECT * FROM user WHERE username='"+user_name+"' AND password='"+pwd+"'");
        //4.使用if处理结果集
        if(rs.next()){
            //说明查询到了数据
            //获取用户名
            String username = rs.getString("username");
            System.out.println("恭喜您，"+username+"登陆成功");
        }else{
            System.out.println("用户名或者密码错误");
        }

        //5.释放资源
        JDBCUtils01.release(conn,st,rs);
    }

    /*
        使用预编译接口PreparedStatement解决sql注入问题
     */
    @Test
    public void login3() throws Exception {
        //定义变量保存用户名和密码
        String user_name = "zhangsan' -- ";
        String pwd = "oaiauq81811";
        //1.注册驱动
        //2.获取和数据库的连接Connection对象
        Connection conn = JDBCUtils01.getConnection();
        //3.使用连接对象调用方法获取发送sql语句对象
        /*
             PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的   SQL 语句发送到数据库。
         */
        PreparedStatement pst = conn.prepareStatement("SELECT * FROM user WHERE username=? AND password=?");
        //4.使用预编译接口PreparedStatement对象调用PreparedStatement接口中的方法给预编译的sql语句中的占位符赋值：
        /*
                oid setString(int parameterIndex, String x) 将指定参数设置为给定 Java String 值。
                参数：
                    parameterIndex - 给sql语句中的第几个占位符赋值，从左向右开始第一个占位符值是1，第二个占位符值是			2... 依次递增
                     x - 参数值 给占位符的实际值
         */
        pst.setString(1,user_name);//1表示第一个占位符
        pst.setString(2,pwd);//2表示第二个占位符
        //5.使用PreparedStatement中的方法执行sql语句 ResultSet executeQuery() 执行查询语句
        ResultSet rs = pst.executeQuery();
        //6.处理结果集
        if(rs.next()){
            //说明查询到了数据
            //获取用户名
            String username = rs.getString("username");
            System.out.println("恭喜您，"+username+"登陆成功");
        }else{
            System.out.println("用户名或者密码错误");
        }
        //7.释放资源
        JDBCUtils01.release(conn,pst,rs);
    }

    /*
        5.需求: 插入用户名 liuyan ，密码123
     */
    @Test
    public void insert() throws Exception {
        //1.获取连接
        Connection conn = JDBCUtils01.getConnection();
        //2.获取发送sql语句的预编译对象
        PreparedStatement pst = conn.prepareStatement("INSERT INTO user VALUES(NULL,?,?)");
        //3.给占位符赋值
        pst.setString(1, "liuyan");
        pst.setString(2,"123");
        //4.发送sql语句
        int i = pst.executeUpdate();
        System.out.println("i = " + i);
        //5.释放资源
        JDBCUtils01.release(conn,pst,null);
    }
}
